package com.uoko.common.thread;

import java.util.function.BooleanSupplier;

/**
 * <p>
 * 线程 辅助工具.
 * </p>
 *
 * @author chenyingchun
 * Email qiaohai@uoko.com
 * created by 2018/6/6 0006
 */
public abstract class Threads {

	/**
	 * 自旋的默认超时时间,默认为10秒
	 */
	public volatile static long DEFAULT_SPIN_TIMEOUT = 10 * 1000;

	/**
	 * 线程睡眠.
	 * 
	 * @param millis
	 *            睡眠毫秒数.
	 */
	public static void sleep(long millis) {
		try {
			// java.util.concurrent.CountDownLatch
			Thread.sleep(millis);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/***
	 * 自旋到符合某个条件, 超时时间为默认DEFAULT_SPIN_TIMEOUT
	 * 
	 * @param booleanSupplier
	 *            条件函数
	 */
	public static void spinUntil(BooleanSupplier booleanSupplier) {
		spinUntil(booleanSupplier, DEFAULT_SPIN_TIMEOUT);
	}

	/**
	 * 自旋到符合某个条件或者超时。
	 * 
	 * @param booleanSupplier
	 *            条件函数
	 * @param timeOut
	 *            超时时间-毫秒
	 */
	public static void spinUntil(BooleanSupplier booleanSupplier, long timeOut) {
		if (booleanSupplier == null || timeOut <= 0)
			return;
		Long timeStar = System.currentTimeMillis();
		/** 自旋,当条件表达式符合或者超时了就跳出 **/
		for (;;) {
			if (booleanSupplier.getAsBoolean() || System.currentTimeMillis() - timeStar >= timeOut)
				return;
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
			}
		}
	}

}
